#include "archivosFactory.h"

ArchivosFactory::ArchivosFactory(){

}
	
ArchivosFactory::~ArchivosFactory(){
	
}
	
ArchivoDatos* ArchivosFactory::crear_archivo(	
								std::string &tipo, 
								std::string& nombre,			
								unsigned int tam_bloque, 
		                        unsigned int tam_paquete){
	TiposArchivo t = to_enum(tipo);
	return crear_archivo(t,nombre, tam_bloque, tam_paquete);
	
}	
ArchivoDatos * ArchivosFactory::crear_archivo(TiposArchivo tipo,
								std::string& nombre,			
								unsigned int tam_bloque, 
			                    unsigned int tam_paquete){
			                    	
	switch( tipo ){
		case SECUENCIAL:
			return new Secuencial(nombre,tam_bloque);
			break;
		case HASH:
			return new Hash(nombre, tam_bloque, tam_paquete);
			break;
		case INDEXADO:
			return new Indexado(nombre,tam_bloque,tam_paquete);
			break;
		case SECUENCIAL_INDEXADO:
			return new SecuencialIndexado(nombre,tam_bloque,tam_paquete);
			break;
		case NINGUNO:
			throw ExcepSintaxisParser("Error - Tipo de archivo inexistente.");
			break;
		default:
			throw ExcepSintaxisParser("Error - Tipo de archivo inexistente.");
			return NULL;
	}			                        
}		                     


TiposArchivo ArchivosFactory::to_enum(std::string tipo){
		
	if(tipo.compare("secuencial") == 0 )
		return SECUENCIAL; 
	if(tipo.compare("hash") == 0 )
		return HASH;
	if(tipo.compare("indexado") == 0 )
		return INDEXADO;
	if(tipo.compare("secIndexado") == 0 )
		return SECUENCIAL_INDEXADO;
	return NINGUNO;		                                   	
}		                                  
		
ArchivosFactory::ArchivosFactory(ArchivosFactory &f){}

ArchivoDatos * ArchivosFactory::hidratar(std::string nombre) throw(ExcepArchInexistente){
	
	
	std::string dest = nombre + ".head";
	Header head(dest);
	ArchivoDatos * a = NULL;
	
	try{
		head.abrir();
		head.hidratar(nombre);
		head.cerrar();
		
		IndiceSec * i = NULL;
		try{
			a = crear_archivo(head.get_tipo_archivo_mae() , nombre, head.get_tam_bloque_mae(), head.get_tam_bloque_ind() );
			((Archivo*)a)->cargar_registro_base( head.get_formato() );
		}catch(ExcepSintaxisParser &e){
			if(a != NULL)
				delete a;
			throw ExcepArchInexistente("Error - No se pudo utilizar el archivo header para cargar.");
		}
		if( head.get_tipo_indice_sec() != NINGUNO){
			try{
				IndicesFactory fab_ind;
				nombre += ".sec"; //cuack
				i = fab_ind.crear_archivo(head.get_tipo_indice_sec(), nombre, head.get_tam_bloque_mae(), head.get_tam_bloque_ind(), head.get_num_campo_ind() );
			}
			catch(ExcepSintaxisParser &e){
				delete a;
				if(i != NULL)
					delete a;
				throw ExcepArchInexistente("Error - No se pudo utilizar el archivo header para cargar.");
			}
			a->set_indice(i);
		}
	}
	catch(ExcepAbriendoArch &e1){
		throw ExcepArchInexistente("Error - No se encontro el archivo header o esta danado.");
	}
	catch(ExcepLeerBloque &e2){
		throw ExcepArchInexistente("Error - No se encontro el archivo header o esta danado.");
	}
	
	return a;
	
}

